home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Softshoe / Lisa's Mac Parts / Events / EventQueue.cp next >
Text File  |  2000-06-23  |  2KB  |  100 lines

  1. // EventQueue.cp
  2.  
  3. #ifndef EventQueue_h
  4. #include "EventQueue.h"
  5. #endif
  6. #ifndef Delayer_h
  7. #include "Delayer.h"
  8. #endif
  9. #ifndef MouseWatcher_h
  10. #include "MouseWatcher.h"
  11. #endif
  12. #ifndef RegionObject_h
  13. #include "RegionObject.h"
  14. #endif
  15. #ifndef WindowObject_h
  16. #include "WindowObject.h"
  17. #endif
  18. #ifndef Quitter_h
  19. #include "Quitter.h"
  20. #endif
  21.  
  22. EventQueue& EventQueue::The()
  23.   {
  24.     static EventQueue the;
  25.     return the;
  26.   }
  27.  
  28. EventQueue::EventQueue()
  29.   : eventCount( 0 )
  30.   {
  31.     FlushEvents( everyEvent, 0 );
  32.   }
  33.  
  34. void EventQueue::operator++()
  35.   {
  36.     DropInvalidEvents();
  37.     
  38.     if ( eventCount > 0 )
  39.       {
  40.         for ( uint32 i = 1; i < eventCount; i++ )
  41.             events[i-1] = events[i];
  42.         --eventCount;
  43.       }
  44.   }
  45.  
  46. const EventRecord& EventQueue::Current()
  47.   {
  48.     if ( eventCount == 0 )
  49.         WaitNextEvent( everyEvent,
  50.                             &events[ eventCount++ ],
  51.                             Delayer::SleepTime(),
  52.                             MouseWatcher::MouseSleepRegion() );
  53.     
  54.     Assert( eventCount > 0 );
  55.     return events[0];
  56.   }
  57.  
  58. const EventRecord& EventQueue::Next()
  59.   {
  60.     Assert( eventCount > 0 );
  61.     
  62.     DropInvalidEvents();
  63.     
  64.     if ( eventCount == 1 )
  65.         WaitNextEvent( everyEvent,
  66.                             &events[ eventCount++ ],
  67.                             0,
  68.                             0 );
  69.     
  70.     Assert( eventCount > 1 );
  71.     return events[1];
  72.   }
  73.  
  74. bool EventQueue::Valid( const EventRecord& event )
  75.   {
  76.     switch( event.what )
  77.       {
  78.         case nullEvent:
  79.             return false;
  80.         
  81.         case activateEvt:
  82.         case updateEvt:
  83.             return WindowObject::CheckedCast(
  84.                         reinterpret_cast<void *>(event.message) ) != 0;
  85.       }
  86.     
  87.     return true;
  88.   }
  89.  
  90. void EventQueue::DropInvalidEvents()
  91.   {
  92.     if ( eventCount > 1 && !Valid( events[1] ) )
  93.         --eventCount;
  94.   }
  95.  
  96. bool EventQueue::Unfinished() const
  97.   {
  98.     return eventCount > 0 || !Quitter::The().ApplicationCanExit();
  99.   }
  100.